#include "network.h"
#include <stdio.h>   

//初始化服务器监听套接字
int init_server_socket(ServerConfig *config) {
    // 1. 创建TCP套接字（IPv4 + 流式传输）
    int listen_fd = socket(AF_INET, SOCK_STREAM, 0);
    if (listen_fd == -1) {
        perror("创建服务端TCP套接字失败");  // 系统错误提示
        return -1;
    }

    // 2. 设置端口复用（避免服务重启时端口被占用）
    int opt = 1;
    if (setsockopt(listen_fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)) == -1) {
        perror("设置服务端TCP套接字端口复用失败");
        close(listen_fd);  // 失败则关闭套接字
        return -1;
    }

    // 3. 绑定IP和端口到套接字
    printf("[服务器] 绑定IP和端口...\n");

    struct sockaddr_in server_addr;
    memset(&server_addr, 0, sizeof(server_addr));  // 清空结构体
    server_addr.sin_family = AF_INET;              // IPv4协议
    server_addr.sin_port = htons(config->port);    // 端口转换为网络字节序

    // 将字符串IP转换为二进制（"192.168.56.102" → 整数）
    server_addr.sin_addr.s_addr = inet_addr(config->ip);

    if (bind(listen_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1) {
        perror("绑定服务端TCP套接字IP和端口失败");
        close(listen_fd);
        return -1;
    }

    // 4. 开始监听
    printf("[服务器] 开始监听...\n");
    printf("[服务器] 最大连接数：%d\n", config->max_connections);

    if (listen(listen_fd, config->max_connections) == -1) {
        perror("监听服务端TCP套接字连接失败");
        close(listen_fd);
        return -1;
    }

    // 调试信息
    printf("[服务器] 已启动监听：%s:%d\n", config->ip, config->port);
    return listen_fd;  // 返回监听套接字描述符
}

//接受客户端连接
int accept_client(int listen_fd, struct sockaddr_in *client_addr) {
    socklen_t client_addr_len = sizeof(struct sockaddr_in);
    printf("[服务器] 等待客户端连接...\n");

    // 阻塞等待客户端连接，成功返回客户端套接字
    int client_fd = accept(listen_fd, (struct sockaddr *)client_addr, &client_addr_len);
    if (client_fd == -1) {
        perror("接受服务端TCP套接字连接失败");
        return -1;
    }

    // 调试：打印客户端IP和端口（网络字节序→主机字节序）
    char client_ip[INET_ADDRSTRLEN];
    inet_ntop(AF_INET, &client_addr->sin_addr, client_ip, INET_ADDRSTRLEN);
    printf("[服务器] 客户端连接：%s:%d（fd=%d）\n", 
           client_ip, ntohs(client_addr->sin_port), client_fd);
    return client_fd;
}

//接收数据
ssize_t recv_data(int sock_fd, char *buffer, size_t buffer_size) {
    memset(buffer, 0, buffer_size);
    ssize_t recv_len = recv(sock_fd, buffer, buffer_size - 1, 0);
    if (recv_len == -1) {
        perror("服务端接收数据失败");
    }
    return recv_len;
}

//发送数据
ssize_t send_data(int sock_fd, const char *data) {
    ssize_t sent = send(sock_fd, data, strlen(data), 0);
    if (sent == -1) {
        perror("服务端发送数据失败");
    }
    return sent;
}